package test_11_23;

public class test11_23_6 {
    /**
         * 这是汉诺塔的递归核心方法
         * @param n           圆盘的数量
         * @param source      源柱子 (一开始放圆盘的柱子)
         * @param auxiliary   辅助柱子 (临时放圆盘的柱子)
         * @param destination 目标柱子 (最终要把圆盘移到的柱子)
         */
        public static void moveTower(int n, char source, char auxiliary, char destination) {
            // 1. 递归终止条件：如果只有1个圆盘
            if (n == 1) {
                // 直接把这个圆盘从源柱移到目标柱，任务完成
                System.out.println("移动圆盘 1 从 " + source + " 到 " + destination);
                return;
            }

            // --- 开始执行“腾位置”的逻辑 ---

            // 2. 递归调用：把 n-1 个圆盘，从 源柱 移到 辅助柱
            //    此时，原来的“辅助柱”变成了临时的“目标柱”
            //    原来的“目标柱”变成了“辅助柱”
            System.out.println("准备工作：要把 " + n + " 个圆盘从 " + source + " 移到 " + destination);
            System.out.println("第一步：先把上面 " + (n-1) + " 个圆盘从 " + source + " 腾到 " + auxiliary + " (用 " + destination + " 当临时货架)");
            moveTower(n - 1, source, destination, auxiliary);

            // --- “腾位置”完成，现在源柱上只剩最大的圆盘 ---

            // 3. 执行最核心的一步：移动最大的那个圆盘 (第 n 个)
            //    从 源柱 直接移到 目标柱
            System.out.println("核心动作：移动最大的圆盘 " + n + " 从 " + source + " 到 " + destination);

            // --- 最大的圆盘已就位，开始执行“回溯”的逻辑 ---

            // 4. 递归调用：把刚才移到 辅助柱 上的 n-1 个圆盘，再移到 目标柱
            //    此时，原来的“源柱”已经空了，变成了新的“辅助柱”
            //    原来的“辅助柱”变成了“源柱”
            System.out.println("第二步：再把 " + (n-1) + " 个圆盘从 " + auxiliary + " 搬回 " + destination + " (用 " + source + " 当临时货架)");
            moveTower(n - 1, auxiliary, source, destination);

            System.out.println("任务完成：" + n + " 个圆盘已从 " + source + " 全部移到 " + destination);
        }

        // 主方法，程序的入口
        public static void main(String[] args) {
            int numberOfDisks = 3; // 我们来演示移动3个圆盘
            System.out.println("汉诺塔开始！目标：移动 " + numberOfDisks + " 个圆盘从 A 到 C");
            System.out.println("------------------------------------");

            // 调用递归方法，初始状态是：
            // 3个圆盘在 A 柱，借助 B 柱，最终移到 C 柱
            moveTower(numberOfDisks, 'A', 'B', 'C');

            System.out.println("------------------------------------");
            System.out.println("汉诺塔结束！");
        }
    }

